WARN_FLAGS=-Wall -Werror
-CFLAGS+=-Isrc -I$(XEN_LIBXC)
+CFLAGS+=-Isrc -I$(XEN_LIBXC) -I$(XEN_XENSTORE)
LDFLAGS+=-Lsrc
all: $(LIB)
$(LIB): $(OBJECTS)
- $(AR) rc $@ $^
+ $(AR) rc $@ $^ $(XEN_XENSTORE)/libxenstore.so
$(RANLIB) $@
$(SHLIB): $(OBJECTS)
#include <string.h>
#include <unistd.h>
#include <xen-interface.h>
+#include <xs.h>
#include "xenstat.h"
/*
struct xenstat_handle {
xi_handle *xihandle;
+ struct xs_handle *xshandle; /* xenstore handle */
int page_size;
FILE *procnetdev;
char xen_version[VERSION_SIZE]; /* xen version running on this node */
struct xenstat_domain {
unsigned int id;
+ char *name;
unsigned int state;
unsigned long long cpu_ns;
unsigned int num_vcpus; /* No. vcpus configured for domain */
static void xenstat_uninit_vcpus(xenstat_handle * handle);
static void xenstat_uninit_networks(xenstat_handle * handle);
static void xenstat_uninit_xen_version(xenstat_handle * handle);
+static char *xenstat_get_domain_name(xenstat_handle * handle, unsigned int domain_id);
static xenstat_collector collectors[] = {
{ XENSTAT_VCPU, xenstat_collect_vcpus,
return NULL;
}
+ handle->xshandle = xs_daemon_open_readonly(); /* open handle to xenstore*/
+ if (handle->xshandle == NULL) {
+ perror("unable to open xenstore\n");
+ free(handle);
+ return NULL;
+ }
+
return handle;
}
for (i = 0; i < NUM_COLLECTORS; i++)
collectors[i].uninit(handle);
xi_uninit(handle->xihandle);
+ xs_daemon_close(handle->xshandle);
free(handle);
}
}
for (i = 0; i < new_domains; i++) {
/* Fill in domain using domaininfo[i] */
domain->id = domaininfo[i].domain;
+ domain->name = xenstat_get_domain_name(handle, domaininfo[i].domain);
domain->state = domaininfo[i].flags;
domain->cpu_ns = domaininfo[i].cpu_time;
domain->num_vcpus = (domaininfo[i].max_vcpu_id+1);
return domain->id;
}
+/* Get the domain name for the domain */
+char *xenstat_domain_name(xenstat_domain * domain)
+{
+ return domain->name;
+}
+
/* Get information about how much CPU time has been used */
unsigned long long xenstat_domain_cpu_ns(xenstat_domain * domain)
{
static void xenstat_uninit_xen_version(xenstat_handle * handle)
{
}
+
+static char *xenstat_get_domain_name(xenstat_handle *handle, unsigned int domain_id)
+{
+ char path[80];
+ char *name;
+ unsigned int *len;
+ struct xs_transaction_handle *xstranshandle;
+
+ snprintf(path, sizeof(path),"/local/domain/%i/name", domain_id);
+
+ xstranshandle = xs_transaction_start(handle->xshandle);
+ if (xstranshandle == NULL) {
+ perror("Unable to get transcation handle from xenstore\n");
+ exit(1); /* Change this */
+ }
+
+ name = (char *) xs_read(handle->xshandle, xstranshandle, path, len);
+
+ xs_transaction_end(handle->xshandle, xstranshandle, false);
+
+ return name;
+}
/* Get the domain ID for this domain */
unsigned xenstat_domain_id(xenstat_domain * domain);
+/* Set the domain name for the domain */
+char *xenstat_domain_name(xenstat_domain * domain);
+
/* Get information about how much CPU time has been used */
unsigned long long xenstat_domain_cpu_ns(xenstat_domain * domain);
man1dir=$(mandir)/man1
sbindir=$(prefix)/sbin
-CFLAGS += -DGCC_PRINTF -Wall -Werror -I$(XEN_LIBXENSTAT)
+CFLAGS += -DGCC_PRINTF -Wall -I$(XEN_LIBXENSTAT)
LDFLAGS += -L$(XEN_LIBXENSTAT)
LDLIBS += -lxenstat -lncurses
#include <time.h>
#include <unistd.h>
+#include <xs.h>
#include <xenstat.h>
#define XENTOP_VERSION "1.0"
static void print_net_rx(xenstat_domain *domain);
static int compare_ssid(xenstat_domain *domain1, xenstat_domain *domain2);
static void print_ssid(xenstat_domain *domain);
+static int compare_name(xenstat_domain *domain1, xenstat_domain *domain2);
+static void print_name(xenstat_domain *domain);
/* Section printing functions */
static void do_summary(void);
/* Field types */
typedef enum field_id {
FIELD_DOMID,
+ FIELD_NAME,
FIELD_STATE,
FIELD_CPU,
FIELD_CPU_PCT,
} field;
field fields[] = {
- { FIELD_DOMID, "DOMID", 5, compare_domid, print_domid },
+// { FIELD_DOMID, "DOMID", 5, compare_domid, print_domid },
+ { FIELD_NAME, "NAME", 10, compare_name, print_name },
{ FIELD_STATE, "STATE", 6, compare_state, print_state },
{ FIELD_CPU, "CPU(sec)", 10, compare_cpu, print_cpu },
{ FIELD_CPU_PCT, "CPU(%)", 6, compare_cpu_pct, print_cpu_pct },
print("%5u", xenstat_domain_id(domain));
}
+/* Compare domain names, returning -1,0,1 for <,=,> */
+int compare_name(xenstat_domain *domain1, xenstat_domain *domain2)
+{
+ return strcasecmp(xenstat_domain_name(domain1), xenstat_domain_name(domain2));
+}
+
+/* Prints domain name */
+void print_name(xenstat_domain *domain)
+{
+ print("%10s", xenstat_domain_name(domain));
+}
+
struct {
unsigned int (*get)(xenstat_domain *);
char ch;